import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import folium
import warnings
warnings.simplefilter('ignore')
dvf_train = pd.read_csv("./dvf_train.csv")
dvf_test = pd.read_csv("./dvf_test.csv")
print(dvf_train.shape)
print(dvf_test.shape)
dvf_train.head()
dvf_train.duplicated().sum()
dvf_train.info()
# Taux des données manquantes
dvf_train.isnull().sum()/len(dvf_train)*100
#Ici, nous constatons que la base de donnée contient beaucoup de variables qui ont un taux de plus de 79% des données manquantes.
#Nous allons exclure ces variables de notre jeu de données.
for col in dvf_train.columns:
if dvf_train[col].isnull().sum()/len(dvf_train)*100 > 79:
dvf_train.drop(columns = col, inplace = True)
dvf_train.shape
# Les variables qui nous restent:
dvf_train.columns
index = ['index']
date = ['Date mutation']
data_quali = ['Nature mutation', 'Type de voie', 'Voie', 'Code postal', 'Commune', 'Code departement', 'Type local']
data_num = ['1er lot', 'Surface Carrez du 1er lot', 'Nombre de lots','Surface reelle bati','Nombre pieces principales', 'lon', 'lat', 'Valeur fonciere']
# En considérant ma compréhention du métier, j'ai fais toute seule quelques jugements qui peuvent étre corrigés avec l'aide d'un expert dans le domaine.
# J'ai choisie d'élimier quelques variables, en pensant que ces dérniéres n'affectent pas notre variable cible : Valeur fonciere.
# J'ai voulu garder la date car c'est intéressant de voir l'évolution des prix au cours du temps,
# mais malheuresement son formatage ne correspond pas à la description donnée et j'ai pas réussi à la formater correctement.
for col in dvf_train.columns:
if col not in index + data_quali + data_num:
dvf_train.drop(columns = col, inplace = True)
dvf_train.shape
dvf_train.head()
dvf_train.isna().sum()
# La variable Surface Carrez du 1er lot comporte encore plusieurs valeurs nulles.
# Pour remplir ces valeur,le mieux est d'utiliser les autres variables et faire une prédiction mais celà sort du cadre de ce test.
# J'ai tout simplement garder une DataFrame où il n'y a pas de valeurs nulle de la variable Surface Carrez du 1er.
# Ce qui rest NaN par rapport aux autres variables est à élimier vu que le nombre n'est pas énorme.
dvf_train = dvf_train[dvf_train["Surface Carrez du 1er lot"].notna()]
dvf_train.dropna(inplace = True)
# Cette manipulation est juste pour réinitialiser l'index de la DataFrame pour ne pas avoir de probléme d'indexation plutard.
dvf_train.to_csv("./data_clean.csv")
dvf_train = pd.read_csv("./data_clean.csv")
dvf_train.head()
# On supprime la colonne "Unnamed: 0" qui correspond à l'ancien index et on vérifie l'existance des valeurs nulles et la nouvelle taille de notre base de donnée.
dvf_train.drop(columns = "Unnamed: 0", inplace = True)
print(dvf_train.isna().sum())
print(dvf_train.shape)
dvf_train.head()
# Les deux variables: Valeur fonciere et Surface Carrez du 1er lot sont censées étre numériques mais elles sont de type Object.
# On ne peut pas les transformer directement en Float à cause de la présence du virgule au lieu du point.
# On fait alors la corretion nécessaire.
for i in range(len(dvf_train)):
dvf_train["Valeur fonciere"][i] = float(dvf_train["Valeur fonciere"][i].replace(',', '.'))
dvf_train["Surface Carrez du 1er lot"][i] = float(dvf_train["Surface Carrez du 1er lot"][i].replace(',', '.'))
# On corrige les types des autres variables de la DataFrame
for col in data_quali:
dvf_train[col] = dvf_train[col].astype('object')
for col in data_num:
#dvf_train[col] = dvf_train[col].astype('float')
dvf_train[col] = pd.to_numeric(dvf_train[col], errors = 'coerce')
dvf_train.dropna(inplace = True)
dvf_train.head()
dvf_train['Type local'].value_counts(normalize = True).head()
plt.figure(figsize=(5,5))
labels = ['Maison', 'Appartement']
colors = ['#ff9999','#66b3ff']
area = [dvf_train['Type local'].value_counts(normalize = True).head()][0]
plt.pie(area, labels=labels)
plt.title(label= 'Répartition de la variable Type local')
plt.legend()
plt.show()
dvf_train['Nature mutation'].value_counts(normalize = True).head()
plt.figure(figsize=(5,5))
labels = ["Vente", "Adjudication", "Vente en l'état futur d'achèvement", "Echange" ]
colors = ['#ff9999','#66b3ff','#ffcc99','#fffc52']
area = [dvf_train['Nature mutation'].value_counts(normalize = True).head()][0]
plt.pie(area, labels=labels)
plt.title(label= 'Répartition de la variable Nature mutation')
plt.legend()
plt.show()
location=dvf_train.groupby(['lat','lon','Voie']).size().reset_index(name='count').sort_values(by='count',ascending=False)
location['color']=location['count'].apply(lambda count:"orange" if count>=400 else
"brown" if count>=300 and count<400 else
"yellow" if count>=200 and count<300 else
"pink" if count>=150 and count<200 else
"black" if count>=100 and count<150 else
"blue" if count>=75 and count<100 else
"green" if count>=50 and count<75 else
"red")
location['size']=location['count'].apply(lambda count:35 if count>=400 else
30 if count>=300 and count<400 else
25 if count>=200 and count<300 else
20 if count>=150 and count<200 else
15 if count>=100 and count<150 else
10 if count>=75 and count<100 else
5 if count>=50 and count<75 else
0.1)
m=folium.Map([46.2276,2.2137],zoom_start=5)
for lat,lon,area,color,count,size in zip(location['lat'],location['lon'],location['Voie'],location['color'],location['count'],location['size']):
folium.CircleMarker([lat, lon],
popup=area,
radius=size,
color='r',
fill=True,
fill_opacity=0.6,
fill_color=color,
).add_to(m)
m